#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>
           int main (void) {
              int myRank, clusterSize;
               int imgHeight, lowerBoundY, upperBoundY, boxSize;
               // Инициализация MPI
               MPI_Init((void *) 0, (void *) 0);
               // Получаем номер текущего узла.
               MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
               // Получаем общее количество узлов.
               MPI_Comm_size(MPI_COMM_WORLD, &clusterSize);
               // boxSize - величина изображения, которую будет обрабатывать
               // каждый узел
               boxSize = imgHeight / clusterSize;
               // lowerBoundY - где каждый узел начинает обработку.
               lowerBoundY = myRank*boxSize;
               // upperBoundY - где каждый узел завершает обработку.
               upperBoundY = lowerBoundY + boxSize;
               // Здесь идет тело программы


FILE *imageFile = fopen("mpi_img.png", "rb");
           // Проверка, что файл существует.
           if (imageFile != NULL) {
               // Чтение заголовка.
               fread(imageHeader, sizeof(char),
               HEADER_LENGTH, imageFile);
               // fseek устанавливает нас на точку изображения,
               // которую будет обрабатывать данный узел.
               fseek(imageFile, lowerBoundY*WIDTH*3, SEEK_SET);
               // Here is where we read in the colors:
               // i - текущая строка в изображении.
               // j - текущий столбец.
               // k - это цвет, 0 для красного, 1 для синего,
               // и 2 для зелёного.
               for (i=0; i<boxSize+1; i++) {
                   for (j=0; j<WIDTH; j++) {
                       for(k=0; k<3; k++) {
                           fread(&byte, 1, 1, imageFile);
                           pixelIndex = i*WIDTH+j+k;
                           origImage[pixelIndex] = byte;
                       }
                   }
               }
           }
           fclose(imageFile);

//примінення фільтра
for (i=0; i<boxSize; i++) {
               for (j=0; j<WIDTH; j++) {
                   if (i>0 && i<(HEIGHT-1) && j>0 && j<(WIDTH-1)){
                   // Сейчас мы применим матрицу фильтра
                   // сначала к текущему пикселю.
                       pixelIndex = i*WIDTH + j;
                       r = origImage[pixelIndex];
                       g = origImage[pixelIndex+1];
                       b = origImage[pixelIndex+2];
                       filter_r = -4*r;
                       filter_g = -4*g;
                       filter_b = -4*b;
                       // Затем к соседнему слева.
                       pixelIndex = i*WIDTH + j - 1;
                       r = origImage[pixelIndex];
                       g = origImage[pixelIndex+1];
                       b = origImage[pixelIndex+2];
                       filter_r += 1*r;
                       filter_g += 1*g;
                       filter_b += 1*b;
                       // Теперь к соседнему справа.
                       pixelIndex = i*WIDTH + j + 1;
                       r = origImage[pixelIndex];
                       g = origImage[pixelIndex+1];
                       b = origImage[pixelIndex+2];
                       filter_r += 1*r;
                       filter_g += 1*g;
                       filter_b += 1*b;
                       // Выше.
                       pixelIndex = (i-1)*WIDTH + j;
                       r = origImage[pixelIndex];
                       g = origImage[pixelIndex+1];
                       b = origImage[pixelIndex+2];
                       filter_r += 1*r;
                       filter_g += 1*g;
                       filter_b += 1*b;
                       // Ниже.
                       pixelIndex = (i+1)*WIDTH + j;
                       r = origImage[pixelIndex];
                       g = origImage[pixelIndex+1];
                       b = origImage[pixelIndex+2];
                       filter_r += 1*r;
                       filter_g += 1*g;
                       filter_b += 1*b;
                   }
                   // Запишем новое значение пикселя.
                   pixelIndex = i*WIDTH + j;
                   filterImage[pixelIndex] = filter_r;
                   filterImage[pixelIndex+1] = filter_g;
                   filterImage[pixelIndex+2] = filter_b;
               }
           }



               // Очистка и выход:
               MPI_Finalize(MPI_COMM_WORLD);
               return 0;
           }

